package com.edu.handler;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Date;

/**
 * 自定义一个调用处理器，代理对象 怎么样进行增强 实际是有 处理器来规定的
 *  1. 需要实现 InvocationHandler接口
 *  2. 在构造时，传入 被代理对象
 */
public class LogHandler implements InvocationHandler {

    private Object obj ;// 代表 被代理对象

    public LogHandler(Object obj) {
        this.obj = obj;
    }

    /**
     * 代理对象 在执行 方法的时候，会按照下述的方法进行执行
     *
     * @param proxy 代表 生成的 代理对象
     * @param method 代表 被代理对象 中的每一个方法
     * @param args 执行方法时 传入的参数
     * @return
     *  代表 每个方法执行完毕之后 返回的结果
     * @throws Throwable
     */
//    @Override
//    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//        System.out.println(obj.getClass()+"的方法:"+method.getName()+"开始执行与:"+new Date());
//        Object result = method.invoke(obj,args);//调用 被代理对象原本的方法
//        return result;
//    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if(obj.getClass().getName() == "UserServiceImpl" || obj.getClass().getName() == "BookServiceImpl"){ //确定了 目标对象
            if(method.getName().startsWith("select")){// 确定了切点
                int a = 10;
                try {
                    // 环绕通知 前置
                    // 前置通知before
                    Object result = method.invoke(obj, args);//核心业务功能代码的执行
                    // 后置返回
                    // 环绕通知 后置after()

                }catch(Exception e){
                    // afterTHrown();
                }finally{
                    // 后置通知

                }


            }

        }


        return method.invoke(obj,args);
    }
}
